from collections.abc import Iterator

# https://pqyiz16he9g.feishu.cn/docx/KRAOdF0ZeouOGzxeRn0cUF5onrf

# 模仿一个range函数的迭代器对象
class MyRange(object):
    def __init__(self,stop_num):
        self.stop_num = stop_num
        self.num = -1 # 数字是从0开始的

    # 返回自己
    def __iter__(self):
        print('__iter__')
        return self
    # 返回下一条数据
    def __next__(self):
        print('__next__')
        self.num += 1
        if self.num == self.stop_num: # 如果返回到最后一条数据，说明没有下一条数据了，抛出异常
            raise StopIteration
        return self.num



if __name__ == '__main__':
    my_range = MyRange(5)
    # print(my_range.__next__())
    # print(my_range.__next__())
    # print(my_range.__next__())
    # print(my_range.__next__())
    # print(my_range.__next__())

    print(isinstance(my_range, Iterator)) # True 是一个迭代器对象
    for num in my_range:
        print(num)

    # 2、for循环的本质
    # for循环的工作原理可以描述为如下动作：
    # 1.使用iter获得可迭代对象的迭代器
    # 2.反复对迭代器使用next函数
    # 3.捕获StopIteration异常，退出循环

